# Q. What is this file?
# A. This file contains options which allow you to configure your multiworld experience while allowing
#    others to play how they want as well.
#
# Q. How do I use it?
# A. The options in this file are weighted. This means the higher number you assign to a value, the
#    more chances you have for that option to be chosen. For example, an option like this:
#
#    map_shuffle:
#      on: 5
#      off: 15
#
#    Means you have 5 chances for map shuffle to occur, and 15 chances for map shuffle to be turned
#    off.
#
# Q. I've never seen a file like this before. What characters am I allowed to use?
# A. This is a .yaml file. You are allowed to use most characters.
#    To test if your yaml is valid or not, you can use this website:
#        http://www.yamllint.com/
#    You can also verify that your Archipelago options are valid at this site:
#        https://archipelago.gg/check

# Your name in-game, limited to 16 characters.
#     {player} will be replaced with the player's slot number.
#     {PLAYER} will be replaced with the player's slot number, if that slot number is greater than 1.
#     {number} will be replaced with the counter value of the name.
#     {NUMBER} will be replaced with the counter value of the name, if the counter value is greater than 1.
name: Player{number}

# Used to describe your yaml. Useful if you have multiple files.
description: Default Shadow Man Remastered Template

game: Shadow Man Remastered
requires:
  version: 0.6.7 # Version of Archipelago required for this yaml to work as expected.

Shadow Man Remastered:
  ################
  # Game Options #
  ################
  progression_balancing:
    # Controls how aggressively key items are pushed toward deeper locations.
    # 0  = uniform random placement.
    # 100 = key items strongly biased toward hardest-to-reach locations.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 0
    # Maximum value is 100
    50: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-0-100: 0 # random value between 0 and 100

  accessibility:
    # Set rules for reachability of your items/locations.
    # 
    # **Full:** ensure everything can be reached and acquired.
    # 
    # **Minimal:** ensure what is needed to reach your goal can be acquired.
    full: 50
    minimal: 0

  gate_preset:
    # Controls how coffin gate soul requirements are shuffled.
    # - story:  All gates open (SL0). No soul requirements anywhere.
    # - easy:   Gates shuffled, capped at SL7. First 6 coffin gates start open.
    # - medium: Gates shuffled, capped at SL8. First 3 coffin gates start open.
    # - hard:   Full shuffle with safety caps. First coffin gate starts open.
    # - chaos:  Fully unconstrained shuffle. Some seeds may be extremely difficult.
    story: 0
    easy: 0
    medium: 0
    hard: 50
    chaos: 0

  max_gate_sl:
    # Caps the highest Soul Level a shuffled coffin gate can require.
    # 10 = no cap (vanilla SL pool, top gate needs all 120 souls — zero slack;
    # generation may fail and retry). Lower values leave slack between the
    # 120-soul supply and the largest requirement, which makes generation far
    # more reliable, especially in multiworlds. Applied on top of the preset's
    # own cap (whichever is lower). Ignored by the story preset.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 3
    # Maximum value is 10
    8: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-3-10: 0 # random value between 3 and 10

  open_gates_n:
    # Overrides the gate preset's own "N gates open" count, forcing the first
    # N coffin gates (a fixed linear order: Marrow, Wasteland, Asylum, Temple,
    # Cageways, Playrooms) to SL0 regardless of which preset is chosen.
    # -1 (default) leaves each preset's own baked-in value alone (story/chaos:
    # 0, easy: 6, medium: 3, hard: 1). 0-6 explicitly overrides it. Resolved
    # before regions/rules are built, so fill logic sees the opened gates
    # correctly either way. Has no visible effect on the story preset, which
    # already sets every gate to SL0.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is -1
    # Maximum value is 6
    -1: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range--1-6: 0 # random value between -1 and 6

  entrance_mode:
    # Shuffles which physical portal in Deadside Marrow Gates leads to which
    # destination — the door that vanilla sends you to (say) the Cageways
    # could instead lead to a Gad Temple, and vice versa.
    # 
    # - off: vanilla connections (default).
    # - deadside_only: the 9 Deadside hub portals (Wasteland, Asylum Gateways,
    #   the 3 Gad Temples, Cageways, Playrooms, Lavaducts, Fogometers) are
    #   shuffled among themselves. Each portal keeps its own physical soul
    #   threshold (fixed by where it actually sits in Deadside) — only where
    #   it leads changes.
    # 
    # cross_hub mode (mixing in the 5 Dark Engine soul gates too, matching the
    # standalone randomizer) is not implemented yet.
    'off': 50
    deadside_only: 0

  shuffle_weapons:
    # If enabled, weapons are shuffled into the randomizer pool.
    # If disabled, weapons appear at their vanilla locations.
    'false': 0
    'true': 50

  shuffle_lore:
    # If enabled, lore items (Book of Shadows, Prophecy, Jack's Schematic)
    # are shuffled into the item pool.
    'false': 0
    'true': 50

  shuffle_bonus:
    # If enabled, the Light Soul (permanent invincibility reward for collecting
    # all 666 Cadeaux) is shuffled into the item pool.
    'false': 50
    'true': 0

  shuffle_enemies:
    # If enabled, enemy types are randomized within each level.
    # Does not affect item placement logic.
    'false': 50
    'true': 0

  deadside_guns:
    # If enabled, forces the vanilla "I like Dead Side Guns" secret on at
    # patch time -- Deadside weapons work on Liveside and vice versa --
    # without needing to find its hidden in-world unlock trigger (Florida
    # Summer Camp, near the final mine shaft). Applied by editing the
    # player's kexengine.cfg directly; requires having launched the game at
    # least once already so that file exists.
    'false': 50
    'true': 0

  enemy_mode:
    # Controls how enemies are shuffled when Shuffle Enemies is enabled.
    # - difficulty:  Difficulty-weighted — harder enemies land in deeper areas.
    # - full:        Draw from all enemy types globally.
    # - contextual:  Shuffle within themed pools per level.
    difficulty: 50
    full: 0
    contextual: 0

  enemy_mix_movement:
    # If enabled, enemy shuffle may swap enemies across movement types
    # (ground/flying/swimming). Ignored unless Shuffle Enemies is on.
    'false': 50
    'true': 0

  enemy_uncap_counts:
    # If enabled, enemy shuffle draws each slot's replacement independently
    # instead of preserving per-type counts — some enemy types may appear far
    # more (or less) often than vanilla. Ignored unless Shuffle Enemies is on.
    'false': 50
    'true': 0

  shuffle_true_forms:
    # If enabled, true form boss enemies (which drop Dark Souls) can swap
    # positions with regular enemies. Soul reachability logic is preserved.
    'false': 50
    'true': 0

  shuffle_ambients:
    # If enabled, friendly/ambient creatures (rats, egrets, flies, butterflies,
    # friendly fish) are shuffled across their spawn slots. Cosmetic only.
    'false': 50
    'true': 0

  ambient_mode:
    # Controls how ambient creatures are shuffled when Shuffle Ambients is enabled.
    # - global:      One pool, no bucketing — a rat can become a fish.
    # - full:        Shuffle within movement type (ground/flying/swimming).
    # - contextual:  Shuffle within context group + movement type.
    global: 50
    full: 0
    contextual: 0

  shuffle_music:
    # If enabled, music tracks are shuffled globally across all levels.
    # Requires a KPF repack — applied by running apply_ap_seed.py (shadow-man-remastered-randomizer repo) against your generated seed, not during AP generation itself.
    'false': 50
    'true': 0

  shuffle_voices:
    # If enabled, Shadow Man's generic voice lines are shuffled.
    'false': 50
    'true': 0

  shuffle_weapons_sfx:
    # If enabled, weapon fire and reload sounds are shuffled within
    # each weapon category.
    'false': 50
    'true': 0

  shuffle_enemies_sfx:
    # If enabled, enemy pain/startle/attack sounds are shuffled between enemy
    # types. Cosmetic only.
    'false': 50
    'true': 0

  shuffle_sky:
    # If enabled, level skyboxes are shuffled between levels. Cosmetic only.
    'false': 50
    'true': 0

  insanity:
    # Controls whether cadeaux (statue/altar) locations exist as AP checks at
    # all.
    # 
    # Off (default): cadeaux locations are excluded from the AP location pool
    # entirely — same treatment as barrels. They stay untouched/vanilla (no
    # checks, no hints, no "Cadeaux" AP item in the pool either). On: all
    # ~657 cadeaux locations become real AP checks with no item-type
    # restriction — any item, including other players' key items, can land
    # there, and a "Cadeaux" filler item is added to the pool to match. May
    # produce more difficult seeds since key items can end up further from a
    # natural playthrough path.
    # 
    # Soul (Govi/Dark Soul altar) locations are unaffected either way — they've
    # always existed as checks eligible to hold any item type. Note this is a
    # narrower scope than the standalone shadow-man-remastered-randomizer
    # tool's own graded "insanity" tiers, which can also open up weapon/lore/
    # bonus/barrel slots (barrels alone would add ~2,085 more locations) —
    # that broader mode isn't implemented here.
    'false': 50
    'true': 0

  cadeaux_bundle_size:
    # Groups cadeaux pickups into a single AP check instead of one check per
    # cadeaux. Only meaningful when Insanity is also on (cadeaux locations
    # don't exist as AP checks at all otherwise).
    # 
    # GLOBAL bundling (redesigned 2026-07-28, Jon's explicit call after
    # seeing ~87 scattered sub-size remainder bundles from the original
    # per-bucket design): every eligible cadeaux across the WHOLE game is
    # shuffled together and chunked into groups of this size, with AT MOST
    # ONE remainder bundle for the entire seed (e.g. 653 cadeaux at 5 ->
    # 130 bundles of x5, one bundle of x3) instead of one remainder per
    # region/gate cluster. The tradeoff: a bundle's representative location
    # can now sit behind a different gate than some of the cadeaux whose
    # value it absorbed, so the reward economy's pacing no longer strictly
    # tracks region/gate progression the way it used to (an early-game
    # cadeaux can end up hollowed out to fund a payout that only becomes
    # collectible much later, or vice versa). This does NOT affect AP's
    # fill/logic correctness or seed completability -- every representative
    # still gets its own individually-correct reachability rule from
    # wherever it physically sits (see regions.py's
    # compute_cadeaux_bundle_representatives()) -- it only changes how the
    # cadeaux economy FEELS relative to game progression.
    # 
    # 1 (default): no bundling, same behavior as before this option existed
    # -- every cadeaux-category location is its own AP check (~657 of them).
    # Higher values cap chunk size at that value; one cadeaux per chunk is
    # chosen at random (per-seed) to remain a real AP location, the rest
    # stay physically untouched/vanilla cadeaux (same treatment as any
    # other non-AP-tracked location) -- collectible in game for the normal
    # vanilla altar/Fogometers cadeaux economy, just without their own
    # individual AP check. E.g. a cap of 5 turns ~657 individual checks
    # into ~131 bundle checks (130 at x5, 1 remainder).
    # 
    # Random per seed (YAML "random", or "random-range-X-Y") is supported
    # the same as any other Range option here.
    # 
    # Shrinks how many "Cadeaux" AP items can ever exist in the pool to
    # match the reduced bundle count -- generate_early()'s existing
    # Fogometers-Cadeaux-Required deficit precollection (see
    # FogometersCadeauxRequired's docstring) automatically scales to cover
    # the larger gap this can create, same mechanism, no separate handling
    # needed.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 1
    # Maximum value is 50
    1: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-1-50: 0 # random value between 1 and 50

  starting_health:
    # Starting (and max) health, as a multiple of 1000. Vanilla is 5 (5000 HP).
    # EXE patch — applied by running apply_ap_seed.py (shadow-man-remastered-randomizer repo) against your generated seed, not during AP generation itself.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 1
    # Maximum value is 10
    5: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-1-10: 0 # random value between 1 and 10

  altar_health_grant:
    # Health granted per life altar interaction, as a multiple of 1000.
    # Vanilla is 1 (1000 HP per altar, 5 altars total). EXE patch — only
    # applies when you run apply_ap_seed.py (shadow-man-remastered-randomizer repo) against your generated seed, not during AP generation itself.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 1
    # Maximum value is 10
    1: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-1-10: 0 # random value between 1 and 10

  altar_cadeaux_required:
    # Minimum Cadeaux required to interact with a life altar or the
    # Fogometers door (cost per interaction always matches). Vanilla is 100.
    # Does not affect AP logic — cadeaux_666 in access_rules.py is currently
    # a no-op. EXE patch — applied by running apply_ap_seed.py (shadow-man-remastered-randomizer repo) against your generated seed, not during AP generation itself.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 1
    # Maximum value is 133
    100: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-1-133: 0 # random value between 1 and 133

  fogometers_cadeaux_required:
    # Total Cadeaux required to open the Fogometers door. Vanilla is 666.
    # Clamped to at least 5x Altar Cadeaux Required. EXE patch — applied by
    # running apply_ap_seed.py (shadow-man-remastered-randomizer repo)
    # against your generated seed, not during AP generation itself.
    # 
    # CORRECTION (2026-07-24): this docstring used to say "Does not affect
    # AP logic" — that stopped being true the same day cadeaux_666() was
    # fixed to actually check state.count("Cadeaux", player) instead of an
    # unconditional True (see access_rules.py). This value IS what the
    # Fogometers Light Soul location's logic checks against when Cadeaux
    # Gated Content (below) is on. Left at the 666 vanilla default, only
    # 653 of the 666 vanilla Cadeaux are ever AP-trackable/verified, so
    # generate_early() precollects the 13-item shortfall as free starting
    # Cadeaux to keep that location solvable — see its comment in
    # __init__.py.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 0
    # Maximum value is 666
    666: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-0-666: 0 # random value between 0 and 666

  cadeaux_gated_content:
    # Controls whether the Fogometers Light Soul location (gated behind
    # SL10 + collecting Fogometers Cadeaux Required worth of Cadeaux) exists
    # as an AP check at all.
    # 
    # Off (default): excluded from the AP location pool entirely — stays
    # untouched/vanilla, same treatment as barrels and enemy checks. On: it
    # becomes a real AP check. Only meaningful when Insanity is also on
    # (Cadeaux is only an AP-tracked item then); with Insanity off the
    # location's own rule always passes, same as before this option existed.
    # 
    # Renamed display_name (2026-07-28, Jon's request): the old name
    # "Cadeaux Gated Content" didn't make clear WHICH content. Settled on
    # "Fog Door Check" — short and pairs with FogometersCadeauxRequired's
    # GUI label ("Fog door:", the threshold THIS toggle's gate checks
    # against when on) rather than spelling out "Fogometers Light Soul Gate
    # in Logic" in full; the docstring above carries the detail instead.
    # 
    # Found and added 2026-07-24 after this location's rule turned out to be
    # unreachable-in-full-accessibility for FillError diagnosis reasons — see
    # __init__.py's generate_early() comment and access_rules.py's
    # cadeaux_666() docstring for the full history.
    'false': 50
    'true': 0

  death_penalty:
    # Max health lost per death, as tenths (10 = -1000 HP/death, 0 = off).
    # Floor equals the penalty amount (health never drops below one step).
    # EXE patch — applied by running apply_ap_seed.py (shadow-man-remastered-randomizer repo) against your generated seed, not during AP generation itself.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 0
    # Maximum value is 100
    0: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-0-100: 0 # random value between 0 and 100

  sprint_multiplier:
    # Hold Shift to move at this multiple of normal speed, on both land and
    # in water, as tenths (20 = 2.0x, 0 = off/vanilla -- no Shift-sprint).
    # EXE patch — applied by running apply_ap_seed.py (shadow-man-remastered-randomizer repo) against your generated seed, not during AP generation itself.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 0
    # Maximum value is 50
    0: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-0-50: 0 # random value between 0 and 50

  soul_threshold_mode:
    # Randomizes the real in-game soul counts required for each Soul Level
    # (SL1-SL10) via EXE patch. AP's own logic (access_rules.py's
    # _soul_level(), fed by this world's resolved self.sl_thresholds) has
    # respected whatever mode is chosen here since 2026-07-20 — it no longer
    # assumes vanilla thresholds, so a shuffled seed's logic and its real
    # in-game requirements stay in sync. See SoulLogicBuffer below if
    # shuffled thresholds are producing seeds that feel razor-tight.
    # - off:         Vanilla thresholds (1,3,7,15,23,35,51,71,95,120).
    # - progressive: Gaps grow geometrically — early SLs cheap, late SLs steep.
    # - balanced:    Roughly equal-sized gaps between thresholds.
    # - full_random: Fully random ascending thresholds (mode="random"
    #                 internally).
    # 
    # full_random's history: existed 2026-07-20, hardened 2026-08-07 (flat
    # minimum gap between every consecutive SL) after being confirmed live
    # to occasionally produce AP-unsatisfiable seeds. Removed outright
    # 2026-08-09 after Jon's own live A/B test (switching a failing seed
    # from full_random to progressive fixed it) — at the time this looked
    # like proof full_random itself was uniquely unsafe.
    # 
    # Re-added 2026-08-09 once the REAL root cause was found and fixed: it
    # was never full_random specifically. create_items()'s Dark Soul
    # progression-count math was reading the fixed VANILLA threshold table
    # to decide `need`, instead of this seed's own resolved
    # self.sl_thresholds — so whenever a mode's real per-SL threshold
    # exceeded the vanilla value at that same index, too few Dark Souls got
    # classified as real `progression` items, making the seed's actual gate
    # unsatisfiable in AP's own logic regardless of Fill placement.
    # Simulation showed this hit "balanced" in 100% of 3000 seeds (by up to
    # +45 souls) and "progressive" in 20-83% of seeds depending on the SL —
    # i.e. progressive and balanced were exposed to the same underlying bug
    # the whole time, just less visibly. Fixing that (create_items() now
    # uses self.sl_thresholds) plus full_random's own 2026-08-07 minimum-gap
    # hardening and a second 2026-08-09 hardening pass (an additional, much
    # larger floor on the final SL9->SL10 gap specifically, since SL10 is
    # hardcoded to require literally every soul in the game and a thin top
    # gap left SL9 almost as fragile) closes both layers full_random's risk
    # ever came from. Confirmed via 10 real generation runs each of
    # progressive and balanced post-fix, zero failures, before re-adding.
    # See soul_threshold_patch.py's randomize_soul_thresholds() for the
    # generator-side mode="random" implementation.
    'off': 50
    progressive: 0
    balanced: 0
    full_random: 0

  soul_logic_buffer:
    # Pads how many souls AP's LOGIC requires before a soul gate, above and
    # beyond the gate's real in-game requirement. E.g. under "easy", a gate
    # that actually only needs 3 souls in-game won't be considered passable
    # by AP's fill/logic until several MORE souls than that have been placed
    # somewhere reachable before it. The real, in-game requirement (what's
    # patched into the exe and shown to the client) is completely
    # unaffected — this only changes how much slack AP leaves itself when
    # deciding where things can go, so a real playthrough that doesn't grab
    # every single reachable soul (or grabs them in a suboptimal order)
    # still comfortably clears each gate instead of landing exactly on the
    # wire. Every gate's padded requirement is still capped at 120 (the
    # maximum possible souls in the game), so this can never make a gate
    # outright impossible.
    # - off:    no padding (default) — exact previous behavior.
    # - hard:   +2 souls of slack per gate.
    # - medium: +4 souls of slack per gate.
    # - easy:   +6 souls of slack per gate.
    # See SOUL_LOGIC_BUFFER_VALUES below for the actual numbers each tier
    # resolves to — change them there, not here, if they ever need tuning.
    # 
    # Briefly defaulted off -> easy (+6) 2026-08-07 as a stopgap alongside
    # the soul_threshold_patch.py "random"-mode top-gap fix, while the real
    # driver of that era's generation failures was still being chased.
    # Reverted back to off 2026-08-09 once the actual root cause
    # (create_items() computing Dark Soul progression counts from vanilla
    # thresholds instead of this seed's own resolved ones — see
    # SoulThresholdMode's docstring above) was found and fixed directly, and
    # confirmed clean via real generation batches. This is a genuinely
    # optional extra-slack knob now, not a safety net standing in for a bug
    # fix — still worth reaching for if a specific seed's soul economy feels
    # razor-tight, but no longer needed by default.
    'off': 50
    hard: 0
    medium: 0
    easy: 0

  piston_combos:
    # Randomizes the 6 Dark Engine piston combination values (via EXE patch).
    # Each piston normally sits at a fixed 3-digit combination; when this is
    # enabled the combinations are rolled per-seed and the in-game journal
    # (Jack's Schematic entry) is rewritten to show the new values.
    # 
    # When enabled, Jack's Schematic (the item that unlocks that journal
    # entry) becomes required progression — you must find it before you can
    # learn the piston combinations needed to shut the pistons off and reach
    # Legion (the final boss), guaranteeing it's always reachable before the
    # game's completion condition. When off (default), the pistons stay at
    # their vanilla combinations and Jack's Schematic is just a regular lore
    # item like any other.
    'false': 50
    'true': 0

  trap_bonus_count:
    # How many "Trap/Bonus" filler items are added to the pool this seed.
    # 
    # Renamed from SecretTrapCount (2026-08-03) when this system grew past
    # just cosmetic secrets — each received item now rolls a random effect
    # from whichever categories are enabled (see TrapBonusSecretsEnabled/
    # TrapBonusHealthEnabled/TrapBonusVoodooEnabled/TrapBonusAmmoEnabled):
    #   secret — a random cosmetic secret effect (Big Head, Wireframe,
    #            Disco Lights, etc.), the original Secret Trap behavior.
    #            Drawn only from secrets confirmed safe to toggle live via
    #            client.py's direct-memory-write approach (see CLAUDE.md's
    #            2026-07-31 "Generalizing past g_dogmode" writeup) --
    #            deliberately excludes secrets whose on-change callback
    #            hasn't been independently verified.
    #   health — poison (drains your whole health pool over ~1 min, ending
    #            in a real death if it isn't stopped by finding health
    #            first) or a gradual heal (restores well past full over the
    #            same window).
    #   voodoo — instantly drains voodoo power to 0, or pins it at its live
    #            cap (the Soul Level meter) for a while.
    #   ammo   — instantly drains Shotgun/Violator/9mm ammo to 0, or fills
    #            and holds them all at max for a while.
    # See TrapBonusMode/TrapBonusDuration for how long the "hold"-style
    # effects (secret, voodoo hold, ammo hold) stick around -- poison and
    # heal have their own fixed internal duration regardless of those
    # options, since they're one-shot processes rather than a toggle.
    # 
    # 0 (default) adds none, same as before this option existed. Random per
    # seed (YAML "random", or "random-range-X-Y") is supported the same as
    # any other Range option here.
    # 
    # Capped at 1000 (2026-08-04, raised from 200, which itself was raised
    # 2026-07-31 from an arbitrary initial 30) -- the real ceiling is
    # however many verified barrel-category locations exist to promote
    # alongside them (~2000+, see generate_early()'s barrel_promoted_locs),
    # so 1000 still leaves headroom without reaching that limit.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 0
    # Maximum value is 1000
    0: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-0-1000: 0 # random value between 0 and 1000

  trap_bonus_mode:
    # Controls how long a Trap/Bonus's effect lasts once received, for the
    # categories where "how long" is meaningful — secret, voodoo hold, and
    # ammo hold. Poison and heal ignore this entirely (they're one-shot
    # processes with their own fixed internal duration); voodoo/ammo drain
    # are instant and have nothing to revert either.
    # 
    # - always_temporary: reverts automatically after Trap/Bonus Duration
    #   seconds (the "for fun" default -- big head for a minute, unlimited
    #   voodoo for a minute, etc.).
    # - always_permanent: stays on for the rest of the session once
    #   received (more of a curse-or-blessing than a temporary trap) --
    #   for secret, reverts on its own the next time you receive ANOTHER
    #   trap that happens to roll the same secret; for voodoo/ammo hold,
    #   keeps re-asserting indefinitely until superseded by that same
    #   category's drain effect.
    # - mixed: each individual Trap/Bonus independently rolls temporary vs
    #   permanent when received, so a single seed can have both.
    # Controlled at the seed level, same as every other randomized setting
    # in this project.
    always_temporary: 50
    always_permanent: 0
    mixed: 0

  trap_bonus_duration:
    # Seconds a temporary Trap/Bonus effect lasts before automatically
    # reverting (see Trap/Bonus Mode) — applies to secret, voodoo hold, and
    # ammo hold. Only matters when a given trap actually goes temporary.
    # Random per seed (YAML "random", or "random-range-X-Y") is supported
    # the same as any other Range option here.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 10
    # Maximum value is 300
    60: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-10-300: 0 # random value between 10 and 300

  trap_bonus_secrets_enabled:
    # If enabled, received Trap/Bonus items can roll a random cosmetic
    # secret effect (Big Head, Wireframe, Disco Lights, etc.). On by default
    # to match this category's original (Secret Trap) behavior.
    'false': 0
    'true': 50

  trap_bonus_health_enabled:
    # If enabled, received Trap/Bonus items can roll poison (drains your
    # whole health pool over ~1 min, ending in a real death if you don't
    # find health first) or a gradual heal (restores well past full over
    # the same window).
    'false': 0
    'true': 50

  trap_bonus_voodoo_enabled:
    # If enabled, received Trap/Bonus items can roll an instant voodoo
    # power drain to 0, or pin voodoo power at its live cap for a while.
    'false': 0
    'true': 50

  trap_bonus_ammo_enabled:
    # If enabled, received Trap/Bonus items can roll an instant ammo drain
    # to 0 (Shotgun/Violator/9mm all at once), or fill and hold all three
    # at max for a while.
    'false': 0
    'true': 50

  death_link:
    # When you die, everyone who enabled death link dies. Of course, the reverse is true too.
    'false': 50
    'true': 0

  death_link_threshold:
    # How many of your own deaths it takes to send one Death Link. 1
    # (default) sends on every death — the same behavior as before this
    # option existed. 5 (the max) means only every 5th death of yours actually
    # broadcasts to the rest of your team; the other 4 die "for free," with
    # no Death Link sent. Only matters when Death Link is also on.
    # 
    # Deaths caused by an incoming Death Link (i.e. someone else on your
    # team died) never count toward your own threshold and are never
    # filtered — you always die immediately when the team dies, regardless
    # of this setting. This only throttles what you send out, not what you
    # receive. See client.py's _health_watcher_loop() for the counter.
    #
    # You can define additional values between the minimum and maximum values.
    # Minimum value is 1
    # Maximum value is 5
    1: 50
    random: 0
    random-low: 0 # random value weighted towards lower values
    random-high: 0 # random value weighted towards higher values
    random-range-1-5: 0 # random value between 1 and 5

  ###########################
  # Item & Location Options #
  ###########################
  local_items:
    # Forces these items to be in their native world.
    []

  non_local_items:
    # Forces these items to be outside their native world.
    []

  start_inventory:
    # Start with the specified amount of these items. Example: "Bomb: 1"
    {}

  start_inventory_from_pool:
    # Start with the specified amount of these items and don't place them in the world. Example: "Bomb: 1"
    # 
    # The game decides what the replacement items will be.
    {}

  start_hints:
    # Start with these item's locations prefilled into the ``!hint`` command.
    []

  start_location_hints:
    # Start with these locations and their item prefilled into the ``!hint`` command.
    []

  exclude_locations:
    # Prevent these locations from having an important item.
    []

  priority_locations:
    # Prevent these locations from having an unimportant item.
    []

  item_links:
    # Share part of your item pool with other players.
    []

  plando_items:
    # Generic items plando.
    []
